package com.bi.dto;

import com.bi.common.PageQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;

/**
 * 数据宽表数据查询DTO
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class WideTableDataQueryDTO extends PageQuery {

    /**
     * 宽表ID
     */
    @NotNull(message = "宽表ID不能为空")
    private Long wideTableId;

    /**
     * 查询字段列表
     */
    private List<String> selectFields;

    /**
     * 查询条件
     */
    private List<QueryCondition> conditions;

    /**
     * 聚合配置
     */
    private AggregationConfig aggregation;

    /**
     * 查询条件
     */
    @Data
    public static class QueryCondition {

        /**
         * 字段名称
         */
        private String field;

        /**
         * 操作符：eq(等于)、ne(不等于)、gt(大于)、gte(大于等于)、lt(小于)、lte(小于等于)、
         * in(包含)、nin(不包含)、like(模糊匹配)、exists(字段存在)、range(范围)
         */
        private String operator;

        /**
         * 查询值
         */
        private Object value;

        /**
         * 范围查询的起始值
         */
        private Object startValue;

        /**
         * 范围查询的结束值
         */
        private Object endValue;

        /**
         * 逻辑连接符：and、or
         */
        private String logic = "and";
    }

    /**
     * 聚合配置
     */
    @Data
    public static class AggregationConfig {

        /**
         * 分组字段
         */
        private List<String> groupByFields;

        /**
         * 聚合函数配置
         */
        private List<AggregationFunction> functions;

        /**
         * 分组后的过滤条件
         */
        private List<QueryCondition> havingConditions;
    }

    /**
     * 聚合函数配置
     */
    @Data
    public static class AggregationFunction {

        /**
         * 函数名称：count、sum、avg、min、max、distinct_count
         */
        private String function;

        /**
         * 聚合字段
         */
        private String field;

        /**
         * 结果字段别名
         */
        private String alias;
    }
}